package com.wnxy.test;

import com.wnxy.pojo.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest
public class App1 {
    // 因为添加了redis的启动器，redis的自动配置生效，会自动创建StringRedisTemplate对象
    // 只能操作redis中的string类型
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    // set key value
    @Test
    public void set(){
        // 存
        stringRedisTemplate.opsForValue().set("cc","22");
        // 取
        String value = stringRedisTemplate.opsForValue().get("cc");
        System.out.println("value = " + value);
    }

    // set key value nx ex 20
    @Test
    public void setnx(){
        // 表示设置key是isLock的值为1，如果isLock已经存在则设置失败；设置成功，有效时间20秒
        Boolean isLock =
                stringRedisTemplate.opsForValue().setIfAbsent("isLock", "1",50,TimeUnit.SECONDS);
        System.out.println("isLock = " + isLock);
    }

    // 查看默认的序列化方式
    @Test
    public void op1_serialize() {
        // StringRedisSerializer@1e29a81a
        System.out.println("查看key的序列化方式：" + stringRedisTemplate.getKeySerializer());
        System.out.println("查看value的序列化方式：" + stringRedisTemplate.getValueSerializer());
    }

    @Test
    public void getAllKeys() {
        // keys *
        Set<String> keys = stringRedisTemplate.keys("*");
        keys.forEach(System.out::println);
    }

    @Test
    public void op3() {
        // 场景：对同一个key进行多次操作。 设置key是name的值为Jack、追加Jackson、获取值
        stringRedisTemplate.opsForValue().set("name","jack");
        stringRedisTemplate.opsForValue().append("name"," Jackson");
        String value = stringRedisTemplate.opsForValue().get("name");
        System.out.println("value = " + value);

        // 简化
        BoundValueOperations<String, String> opt =
                stringRedisTemplate.boundValueOps("name1");
        opt.set("Rose");            // 操作的key是name1
        opt.append(" Honney");      // 操作的key是name1
        String result = opt.get();  // 操作的key是name1
        System.out.println("result = " + result);
    }
}
